package num36;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;

/**
 * @author : DuJiabao
 * @Date : 2021/2/8 20:35
 * @Project : sword-finger-offer
 * @File : null.java
 * @Desc :  有效的数独
 * https://leetcode-cn.com/problems/valid-sudoku/
 * 解法: 通过三个数组标志位,逐行逐列逐个block记录是否已存在,进而实现数独的检查
 */
class Solution {
  public static void main(String[] args) {
    char[][] board = new char[][]{{'5', '3', '.', '.', '7', '.', '.', '.', '.'}, {'6', '.', '.', '1', '9', '5', '.', '.', '.'}, {'.', '9', '8', '.', '.', '.', '.', '6', '.'}, {'8', '.', '.', '.', '6', '.', '.', '.', '3'}, {'4', '.', '.', '8', '.', '3', '.', '.', '1'}, {'7', '.', '.', '.', '2', '.', '.', '.', '6'}, {'.', '6', '.', '.', '.', '.', '2', '8', '.'}, {'.', '.', '.', '4', '1', '9', '.', '.', '5'}, {'.', '.', '.', '.', '8', '.', '.', '7', '9'}};
    Solution solution = new Solution();
    boolean validSudoku = solution.isValidSudoku(board);
    System.out.println(validSudoku);
  }

  public boolean isValidSudoku(char[][] board) {
    boolean[][] cols = new boolean[board.length][board.length];
    boolean[][] rows = new boolean[board.length][board.length];
    boolean[][] blocks = new boolean[board.length][board.length];

    for (int i = 0; i < board.length; i++) {
      for (int j = 0; j < board[0].length; j++) {
        char c = board[i][j];
        if (!Character.isDigit(c)) continue;
        int num = Integer.parseInt(String.valueOf(c)) - 1;
        int blockIndex = (i / 3) * 3 + j / 3;
        if (cols[j][num] || rows[i][num] || blocks[blockIndex][num]) return false;
        cols[j][num] = true;
        rows[i][num] = true;
        blocks[blockIndex][num] = true;
      }
    }
    return true;
  }
}
